/**
 * @param {Function} func
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function debounce(func, wait, immediate) {
	let timeout, args, context, timestamp, result

	const later = function() {
		// 据上一次触发时间间隔
		const last = +new Date() - timestamp

		// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
		if (last < wait && last > 0) {
			timeout = setTimeout(later, wait - last)
		} else {
			timeout = null
			// 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
			if (!immediate) {
				result = func.apply(context, args)
				if (!timeout) context = args = null
			}
		}
	}

	return function(...args) {
		context = this
		timestamp = +new Date()
		const callNow = immediate && !timeout
		// 如果延时不存在，重新设定延时
		if (!timeout) timeout = setTimeout(later, wait)
		if (callNow) {
			result = func.apply(context, args)
			context = args = null
		}

		return result
	}
}

/**
 * This is just a simple version of deep copy
 * Has a lot of edge cases bug
 * If you want to use a perfect deep copy, use lodash's _.cloneDeep
 * @param {Object} source
 * @returns {Object}
 */
export function deepClone(source) {
	if (!source && typeof source !== 'object') {
		throw new Error('error arguments', 'deepClone')
	}
	const targetObj = source.constructor === Array ? [] : {}
	Object.keys(source).forEach(keys => {
		if (source[keys] && typeof source[keys] === 'object') {
			targetObj[keys] = deepClone(source[keys])
		} else {
			targetObj[keys] = source[keys]
		}
	})
	return targetObj
}

export function textToImage(text = 'watermark', fontsize = 40, fontcolor = 'rgba(0,0,0,0.1)') {
	const cwidth = 384; //window.screen.width;
	const cheight = 230;
	const canvas = document.createElement('canvas');
	canvas.width = cwidth;
	canvas.height = cheight;
	const ctx = canvas.getContext('2d');
	ctx.rotate(-Math.PI / 6);
	ctx.translate(-85, 85);
	ctx.font = fontsize + "px Microsoft Yahei";
	ctx.fillStyle = fontcolor;
	ctx.textBaseline = "top";
	const textWidth = ctx.measureText(text).width
	ctx.fillText(text, (cwidth - textWidth) * 0.5, (cheight - fontsize) * 0.5);
	return canvas.toDataURL('image/png');
}


export function isArray(obj) {
	return (typeof obj == 'object') && obj.constructor == Array;
}

export function isString(str) {
	return (typeof str == 'string') && str.constructor == String;
}

export function isNumber(obj) {
	return (typeof obj == 'number') && obj.constructor == Number;
}

export function isDate(obj) {
	return (typeof obj == 'object') && obj.constructor == Date;
}

export function isFunction(obj) {
	return (typeof obj == 'function') && obj.constructor == Function;
}

export function isObject(obj) {
	return (typeof obj == 'object') && obj.constructor == Object;
}
